home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Mousetools / MouseShift / MouseShift.asm < prev    next >
Assembly Source File  |  1996-09-26  |  5KB  |  301 lines

  1.     OPT    A+,O+,OW-        ;enable optimizing
  2.  
  3. ;------------------ MouseShift.asm   ©1992 Garrick Meeker ---------------
  4. ;
  5. ; Installs an input handler that converts a middle mouse button press to
  6. ; a left shift key press.
  7. ;
  8. ; Version 2.0 - This program now installs a commodity under V37.
  9. ; Version 2.1 - Fixed bug, now runs under AmigaDOS 3.0 correctly.
  10. ;-----------------------------------------------------------------------
  11.  
  12.     include    "exec/types.i"
  13.     include    "dos/dos.i"
  14.     include    "exec/exec_lib.i"
  15.     include    "exec/memory.i"
  16.     include    "exec/io.i"
  17.     include    "devices/input.i"
  18.     include    "devices/inputevent.i"
  19.     include    "libraries/commodities.i"
  20.     include    "misc/easystart.i"
  21.  
  22.     XREF    _CreatePort
  23.     XREF    _CreateExtIO
  24.     XREF    _DeletePort
  25.     XREF    _DeleteExtIO
  26.  
  27.     XDEF    _SysBase
  28.  
  29. CALLCX    MACRO
  30.     XREF    _LVO\1
  31.     move.l    _CxBase,a6
  32.     jsr    _LVO\1(a6)
  33.     ENDM
  34.  
  35.     moveq    #0,d5
  36.  
  37.     move.l    4.W,a6
  38.     cmp.w    #37,LIB_VERSION(a6)
  39.     bcc    Release2_Code
  40.  
  41.     move.l    #0,-(sp)
  42.     move.l    #0,-(sp)
  43.     jsr    _CreatePort
  44.     addq.l    #8,sp
  45.     move.l    d0,d2
  46.     beq    exit
  47.  
  48.     move.l    #IS_SIZE,d0
  49.     move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  50.     CALLEXEC AllocMem
  51.     move.l    d0,d3
  52.     beq    quit4
  53.  
  54.     move.l    #IOSTD_SIZE,-(sp)
  55.     move.l    d2,-(sp)
  56.     jsr    _CreateExtIO
  57.     addq.l    #8,sp
  58.     move.l    d0,d4
  59.     beq    quit3
  60.  
  61.     lea    devname,a0        ;name
  62.     moveq    #0,d0            ;unit
  63.     move.l    d4,a1            ;iORequest
  64.     moveq    #0,d1            ;flags
  65.     CALLEXEC OpenDevice
  66.     tst.l    d0
  67.     bne    quit2
  68.  
  69.     move.l    #_HandlerSize,d0
  70.     move.l    #MEMF_PUBLIC,d1
  71.     CALLEXEC AllocMem
  72.     move.l    d0,d5
  73.     beq    quit1
  74.  
  75.     lea    _ChangeEvent,a0
  76.     move.l    d5,a1
  77.     move.l    #_HandlerSize,d0
  78.     CALLEXEC CopyMem
  79.  
  80.     move.l    d3,a0
  81.     move.l    d4,a1
  82.  
  83.     clr.l    IS_DATA(a0)
  84.     move.l    d5,IS_CODE(a0)
  85.     move.b    #60,LN_PRI(a0)
  86.     move.l    #name,LN_NAME(a0)
  87.  
  88.     move.l    d3,IO_DATA(a1)
  89.     move.w    #IND_ADDHANDLER,IO_COMMAND(a1)
  90.  
  91. ;IO struct already in A1
  92.     CALLEXEC DoIO
  93.  
  94.     moveq    #0,d3
  95.  
  96. quit1    move.l    d4,a1
  97.     CALLEXEC CloseDevice
  98.  
  99. quit2    move.l    d4,-(sp)
  100.     jsr    _DeleteExtIO
  101.     addq.l    #4,sp
  102.  
  103. quit3    tst.l    d3            ;can't be freed if handler installed
  104.     beq    quit4
  105.     move.l    d3,a1
  106.     move.l    #IS_SIZE,d0
  107.     CALLEXEC FreeMem
  108.  
  109. quit4    move.l    d2,-(sp)
  110.     jsr    _DeletePort
  111.     addq.l    #4,sp
  112.  
  113. byebye    tst.l    d5            ;set return code
  114.     beq    exit
  115.     moveq    #0,d0
  116.     rts
  117.  
  118. exit    move.l    #20,d0
  119.     rts
  120.  
  121. devname    dc.b    'input.device',0
  122.     EVEN
  123.  
  124. *** HANDLER CODE ***
  125.  
  126. * The event list is passed in a0.
  127. * The is_Data field is passed in a1.
  128.  
  129. * On exit the event list must be returned in d0.
  130.  
  131. _ChangeEvent    move.l    a0,-(sp)
  132.  
  133. CheckLoop
  134.     bsr    change
  135.     move.l    (a0),d0
  136.     move.l    d0,a0
  137.     bne.s    CheckLoop
  138.  
  139.     move.l    (sp)+,d0
  140.     rts
  141.  
  142. CxChange
  143.     movem.l    d0-1/a0-1/a6,-(sp)
  144.     move.l    24(sp),a0
  145.     CALLCX    CxMsgData
  146.     move.l    d0,a0
  147.     bsr    change
  148.     movem.l    (sp)+,d0-1/a0-1/a6
  149.     rts
  150.  
  151. change
  152.     bclr.b    #IEQUALIFIERB_MIDBUTTON-8,ie_Qualifier(a0)
  153.     beq.s    CheckRaw
  154.     bset.b    #IEQUALIFIERB_LSHIFT,ie_Qualifier+1(a0)
  155.  
  156. CheckRaw
  157.     cmp.b    #IECLASS_RAWMOUSE,ie_Class(a0)
  158.     bne.s    NextEvent
  159.  
  160.     move.w    ie_Code(a0),d0
  161.     and.w    #~IECODE_UP_PREFIX,d0
  162.     cmp.w    #IECODE_MBUTTON,d0
  163.     bne.s    NextEvent
  164.     sub.w    #IECODE_MBUTTON-$60,ie_Code(a0)        ;left shift
  165.     move.b    #IECLASS_RAWKEY,ie_Class(a0)
  166.  
  167. NextEvent
  168.     rts
  169.  
  170. name    dc.b    'Mouse Shift',0
  171.     EVEN
  172.  
  173. _HandlerSize    equ    *-_ChangeEvent
  174.  
  175. ;--- LEFT AMIGA ---- LEFT ALT ---- LEFT SHIFT ---
  176. ;       -66-           -64-           -60-
  177. ;--- RIGHT AMIGA --- RIGHT ALT --- RIGHT SHIFT ---
  178. ;       -67-           -65-           -61-
  179. ;--- CTRL ---
  180. ;    -63-
  181.  
  182. Release2_Code
  183.     lea    comlib_name,a1            ;get library
  184.     moveq    #37,d0
  185.     CALLEXEC OpenLibrary
  186.     move.l    d0,_CxBase
  187.     beq    byebye
  188.  
  189.     CALLEXEC CreateMsgPort            ;get msgport
  190.     move.l    d0,msgport
  191.     beq    abort1
  192.     move.l    d0,broker_struct+nb_Port
  193.  
  194.     move.l    d0,a0                ;get port signal
  195.     move.b    MP_SIGBIT(a0),d0
  196.     move.l    #SIGBREAKF_CTRL_C,d1
  197.     bset    d0,d1
  198.     move.l    d1,signums
  199.  
  200.     lea    broker_struct,a0
  201.     moveq    #0,d0
  202.     CALLCX    CxBroker
  203.     move.l    d0,broker
  204.     beq    abort2
  205.  
  206.     moveq    #CX_CUSTOM,d0
  207.     lea    CxChange,a0
  208.     sub.l    a1,a1
  209.     CALLCX    CreateCxObj
  210.     tst.l    d0
  211.     beq    abort3
  212.     move.l    d0,a1
  213.     move.l    broker,a0
  214.     CALLCX    AttachCxObj
  215.  
  216.     move.l    broker,a0
  217.     moveq    #1,d0
  218.     CALLCX    ActivateCxObj
  219.  
  220. *** Release 2 Handler ***
  221. wait    move.l    signums,d0
  222.     CALLEXEC Wait
  223.     btst    #SIGBREAKB_CTRL_C,d0
  224.     bne    abort3            ;CTRL-C hit
  225.  
  226. ie_loop    move.l    msgport,a0
  227.     CALLEXEC GetMsg
  228.     tst.l    d0
  229.     beq    wait
  230.     move.l    d0,a2
  231.  
  232.     move.l    a2,a0
  233.     CALLCX    CxMsgType
  234.     move.l    d0,d6
  235.     move.l    a2,a0
  236.     CALLCX    CxMsgID
  237.     move.l    d0,d4
  238.  
  239.     move.l    a2,a1
  240.     CALLEXEC ReplyMsg
  241.  
  242.     cmp.l    #CXM_COMMAND,d6
  243.     bne    ie_loop
  244.     cmp.l    #CXCMD_DISABLE,d4
  245.     bne    .on
  246.     move.l    broker,a0
  247.     moveq    #0,d0
  248.     CALLCX    ActivateCxObj
  249.     bra    ie_loop
  250. .on    cmp.l    #CXCMD_ENABLE,d4
  251.     bne    .kill
  252.     move.l    broker,a0
  253.     moveq    #1,d0
  254.     CALLCX    ActivateCxObj
  255.     bra    ie_loop
  256. .kill    cmp.l    #CXCMD_KILL,d4
  257.     bne    .unique
  258.     bra    abort3            ;exit
  259. .unique    cmp.l    #CXCMD_UNIQUE,d4
  260.     bne    ie_loop
  261.  
  262. abort3    move.l    broker,a0        ;delete CxObject
  263.     CALLCX    DeleteCxObjAll
  264.  
  265. .remmsg    move.l    msgport,a0
  266.     CALLEXEC GetMsg
  267.     tst.l    d0
  268.     beq    abort2
  269.     move.l    d0,a1
  270.     CALLEXEC ReplyMsg
  271.     bra    .remmsg
  272.  
  273. abort2    move.l    msgport,a0        ;delete message port
  274.     CALLEXEC DeleteMsgPort
  275.  
  276. abort1    move.l    _CxBase,a1        ;close commodities.library
  277.     CALLEXEC CloseLibrary
  278.     bra    byebye
  279.  
  280. broker_struct
  281.     dc.b    NB_VERSION,0
  282.     dc.l    name
  283.     dc.l    CommTitle
  284.     dc.l    CommDesc
  285.     dc.w    NBU_UNIQUE!NBU_NOTIFY
  286.     dc.w    0
  287.     dc.b    60,0            ;priority
  288.     dc.l    0
  289.     dc.w    0
  290.  
  291. msgport    dc.l    0
  292. signums    dc.l    0
  293. broker    dc.l    0
  294. _CxBase    dc.l    0
  295.  
  296. comlib_name    dc.b    'commodities.library',0
  297. CommTitle    dc.b    'Mouse Shift by Garrick Meeker',0
  298. CommDesc    dc.b    'Turns middle button into a shift key',0
  299.     EVEN
  300.  
  301.